package santeclair.referentiel.optique.referentiel.dao.impl;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Repository;

import santeclair.lunar.framework.dao.jpa.exception.JpaExceptionHelper;
import santeclair.lunar.framework.dao.jpa.impl.FwkCodeJpaDAO;
import santeclair.referentiel.optique.config.Constant;
import santeclair.referentiel.optique.model.FabricantOptique;
import santeclair.referentiel.optique.referentiel.dao.FabricantOptiqueDAO;

@Repository
public class FabricantOptiqueDAOImpl extends FwkCodeJpaDAO<FabricantOptique, String> implements FabricantOptiqueDAO {

    @PersistenceContext(unitName = Constant.PERSISTENCE_UNIT_NAME)
    private EntityManager em;

    @Override
    public Class<FabricantOptique> getEntityClass() {
        return FabricantOptique.class;
    }

    @Override
    public EntityManager getEntityManager() {
        return em;
    }

    /***
     * {@inheritDoc}
     */
    @Override
    public FabricantOptique getFabricantOptiqueByCodeOpto(String codeOpto10) throws NoResultException {

        StringBuffer sbf = new StringBuffer();
        sbf.append("SELECT fabricantoptique ");
        sbf.append("FROM FabricantOptique fabricantoptique ");
        sbf.append("WHERE codeOpto10FabricantOptique = :fabricantCodeopto ");

        TypedQuery<FabricantOptique> query = em.createQuery(sbf.toString(), FabricantOptique.class);
        query.setParameter("fabricantCodeopto", codeOpto10);

        try {
            return query.getSingleResult();
        } catch (NoResultException nre) {
            throw JpaExceptionHelper.addQueryInformation(sbf.toString(), query, nre, NoResultException.class);
        }

    }

    @Override
    public FabricantOptique getFabricantOptiqueByCodeWithGrilleFetched(String code) throws NoResultException {
        StringBuffer sbf = new StringBuffer();
        sbf.append(" SELECT fabricantoptique ");
        sbf.append(" FROM FabricantOptique fabricantoptique ");
        sbf.append(" LEFT JOIN FETCH fabricantoptique.grilleTarifaires ");
        sbf.append(" WHERE fabricantoptique.codeFabricantOptique = :codeFabricantOptique ");
        
        TypedQuery<FabricantOptique> query = em.createQuery(sbf.toString(), FabricantOptique.class);
        query.setParameter("codeFabricantOptique", code);

        try {
            return query.getSingleResult();
        } catch (NoResultException nre) {
            throw JpaExceptionHelper.addQueryInformation(sbf.toString(), query, nre, NoResultException.class);
        }
    }

}
